package pe.gob.mininter.dirandro.vaadin.panel.informe;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.DetPerInmExp;
import pe.gob.mininter.dirandro.model.DetPerVehExp;
import pe.gob.mininter.dirandro.model.Informe;
import pe.gob.mininter.dirandro.model.TituloRegistral;
import pe.gob.mininter.dirandro.service.ExpedienteInmuebleService;
import pe.gob.mininter.dirandro.service.ExpedienteVehiculoService;
import pe.gob.mininter.dirandro.service.TituloRegistralService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;

@SuppressWarnings("serial")
public class PanelRegistroInformeTitulo extends CustomComponent implements ClickListener{

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlPrincipal;
	@AutoGenerated
	private Table tblTitulo;
	@AutoGenerated
	private Button btnGuardar;
	@AutoGenerated
	private HorizontalLayout lytFormulario4;
	@AutoGenerated
	private PopupDateField dtFechaTermino;
	@AutoGenerated
	private Label lblFechaTermino;
	@AutoGenerated
	private ComboBoxLOVS cmbSede;
	@AutoGenerated
	private Label lblSede;
	@AutoGenerated
	private HorizontalLayout lytFormulario3;
	@AutoGenerated
	private PopupDateField dtFechaTitulo;
	@AutoGenerated
	private Label lblFechaTitulo;
	@AutoGenerated
	private TextField txtNroTitulo;
	@AutoGenerated
	private Label lblNroTitulo;
	@AutoGenerated
	private HorizontalLayout lytFormulario2;
	@AutoGenerated
	private PopupDateField dtFechaSeguimiento;
	@AutoGenerated
	private Label lblFechaSeguimiento;
	@AutoGenerated
	private ComboBoxLOVS cmbEstado;
	@AutoGenerated
	private Label lblEstado;
	@AutoGenerated
	private HorizontalLayout lytFormulario1;
	@AutoGenerated
	private ComboBox cmbInmueble;
	@AutoGenerated
	private Label lblInmueble;
	@AutoGenerated
	private ComboBox cmbVehiculo;
	@AutoGenerated
	private Label lblVehiculo;
	private Informe informe;
	private TituloRegistralService tituloRegistralService;
	private ExpedienteVehiculoService expedienteVehiculoService;
	private ExpedienteInmuebleService expedienteInmuebleService;
	
	public Informe getInforme() {
		return informe;
	}

	public void setInforme(Informe informe) {
		this.informe = informe;
		
		List<DetPerVehExp> lstExpVehiculos = expedienteVehiculoService.buscar(null);
		BeanItemContainer<DetPerVehExp> containerVehiculo = new BeanItemContainer<DetPerVehExp>(DetPerVehExp.class,  lstExpVehiculos);
		cmbVehiculo.setContainerDataSource(containerVehiculo);
		cmbVehiculo.setItemCaptionPropertyId("nombreCompleto");
		cmbVehiculo.setInputPrompt("Vehiculo");
		
		DetPerInmExp detinm = new DetPerInmExp();
		detinm.setExpediente(informe.getExpediente());
		List<DetPerInmExp> lstinmuebles = expedienteInmuebleService.buscar(detinm);
		BeanItemContainer<DetPerInmExp> containerInmueble = new BeanItemContainer<DetPerInmExp>(DetPerInmExp.class, lstinmuebles);
		cmbInmueble.setContainerDataSource(containerInmueble);
		cmbInmueble.setItemCaptionPropertyId("nombreCompleto");
		cmbInmueble.setInputPrompt("Inmueble");
	}
	
	public static final String COLUMNA_VEHICULO = "vehiculo";
	public static final String COLUMNA_INMUEBLE = "inmueble";
	public static final String COLUMNA_ESTADO_TRAMITE = "estado_tramite";
	public static final String COLUMNA_FECHA_SEGUIMIENTO = "fecha_seguimiento";
	public static final String COLUMNA_NRO_TITULO = "nro_titulo";
	public static final String COLUMNA_FECHA_TITULO = "fecha_titulo";
	public static final String COLUMNA_SEDE = "sede";
	public static final String COLUMNA_FECHA_TERMINO = "fecha_termino";
	public static final String COLUMNA_OPCION_ELIMINAR = "eliminar";
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public PanelRegistroInformeTitulo() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		tituloRegistralService=Injector.obtenerServicio(TituloRegistralService.class);
		expedienteVehiculoService=Injector.obtenerServicio(ExpedienteVehiculoService.class);
		expedienteInmuebleService=Injector.obtenerServicio(ExpedienteInmuebleService.class);
		postConstruct();
	}

	public void postConstruct() {
		
		cmbEstado.setCodigoLista(Constante.LISTA.CODIGO.ESTADO);
		cmbEstado.setInputPrompt("Estado");
		
		txtNroTitulo.setNullRepresentation(StringUtils.EMPTY);
		txtNroTitulo.setInputPrompt("N° Titulo Registral");
		
		cmbSede.setCodigoLista(Constante.LISTA.CODIGO.SEDE_REG);
		cmbSede.setInputPrompt("Sede");
		
		dtFechaSeguimiento.setInputPrompt("Fecha Seguimiento");
		dtFechaTitulo.setInputPrompt("Fecha Titulo Registral");
		dtFechaTermino.setInputPrompt("Fecha Termino Subsanacion");
		
		btnGuardar.addListener(this);
	
		cargarDatos();
		
	}
	
	private void limpiar(){
		cmbVehiculo.setValue(null);
		cmbInmueble.setValue(null);
		cmbEstado.setValue(null);
		dtFechaSeguimiento.setValue(null);
		txtNroTitulo.setValue(null);
		dtFechaTitulo.setValue(null);
		cmbSede.setValue(null);
		dtFechaTermino.setValue(null);
	}
	
	private void cargarDatos(){
		TituloRegistral tituloRegistralBuscar=new TituloRegistral();
		tituloRegistralBuscar.setInforme(informe);
		List<TituloRegistral> tituloRegistrales=tituloRegistralService.buscar(tituloRegistralBuscar);
		
		IndexedContainer container = new IndexedContainer();
		container.addContainerProperty(COLUMNA_VEHICULO, String.class,  null);
        container.addContainerProperty(COLUMNA_INMUEBLE, String.class,  null);
        container.addContainerProperty(COLUMNA_ESTADO_TRAMITE, String.class,  null);
        container.addContainerProperty(COLUMNA_FECHA_SEGUIMIENTO, String.class,  null);
        container.addContainerProperty(COLUMNA_NRO_TITULO, String.class,  null);
        container.addContainerProperty(COLUMNA_FECHA_TITULO, String.class,  null);
        container.addContainerProperty(COLUMNA_SEDE, String.class,  null);
        container.addContainerProperty(COLUMNA_FECHA_TERMINO, String.class,  null);
        container.addContainerProperty(COLUMNA_OPCION_ELIMINAR, Button.class,  null);
        
        DateFormat df=new SimpleDateFormat("dd/MM/yyyy");
        
        int con=1;
		for (final TituloRegistral tituloRegistral : tituloRegistrales) {
			Item item=container.addItem(con++);
			item.getItemProperty(COLUMNA_VEHICULO).setValue(tituloRegistral.getVehiculo()==null?null:tituloRegistral.getVehiculo().getNombreCompleto());
			item.getItemProperty(COLUMNA_INMUEBLE).setValue(tituloRegistral.getInmueble()==null?null:tituloRegistral.getInmueble().getNombreCompleto());
			item.getItemProperty(COLUMNA_ESTADO_TRAMITE).setValue(tituloRegistral.getEstadoTramite()==null?null:tituloRegistral.getEstadoTramite().getNombre());
			item.getItemProperty(COLUMNA_FECHA_SEGUIMIENTO).setValue(tituloRegistral.getFechaSeguimiento()==null?null:df.format(tituloRegistral.getFechaSeguimiento()));
			item.getItemProperty(COLUMNA_NRO_TITULO).setValue(tituloRegistral.getNroTitulo());
			item.getItemProperty(COLUMNA_FECHA_TITULO).setValue(tituloRegistral.getFechaTitulo()==null?null:df.format(tituloRegistral.getFechaTitulo()));
			item.getItemProperty(COLUMNA_SEDE).setValue(tituloRegistral.getSedeRegistral()==null?null:tituloRegistral.getSedeRegistral().getNombre());
			item.getItemProperty(COLUMNA_FECHA_TERMINO).setValue(tituloRegistral.getFechaTermino()==null?null:df.format(tituloRegistral.getFechaTermino()));
			Button eliminar=new Button();
			eliminar.setCaption("Eliminar");
			eliminar.addListener(new ClickListener() {
				
				@Override
				public void buttonClick(ClickEvent event) {
					tituloRegistralService.eliminar(tituloRegistral);
					cargarDatos();
				}
			});
			item.getItemProperty(COLUMNA_OPCION_ELIMINAR).
			setValue(eliminar);
		}
        
        tblTitulo.setContainerDataSource(container);
        tblTitulo.setVisibleColumns(new Object[]{COLUMNA_VEHICULO, 
        		COLUMNA_INMUEBLE, COLUMNA_ESTADO_TRAMITE, 
        		COLUMNA_FECHA_SEGUIMIENTO, COLUMNA_NRO_TITULO,
        		COLUMNA_FECHA_TITULO, COLUMNA_SEDE,
        		COLUMNA_FECHA_TERMINO, COLUMNA_OPCION_ELIMINAR});
        tblTitulo.setColumnWidth(COLUMNA_VEHICULO, 100);
        tblTitulo.setColumnWidth(COLUMNA_INMUEBLE, 100);
        tblTitulo.setColumnWidth(COLUMNA_ESTADO_TRAMITE, 100);
        tblTitulo.setColumnWidth(COLUMNA_FECHA_SEGUIMIENTO, 70);
        tblTitulo.setColumnWidth(COLUMNA_NRO_TITULO, 100);
        tblTitulo.setColumnWidth(COLUMNA_FECHA_TITULO, 70);
        tblTitulo.setColumnWidth(COLUMNA_SEDE, 100);
        tblTitulo.setColumnWidth(COLUMNA_FECHA_TERMINO, 70);
        tblTitulo.setColumnWidth(COLUMNA_OPCION_ELIMINAR, 90);
        tblTitulo.setColumnHeader(COLUMNA_VEHICULO, "Vehiculo");
        tblTitulo.setColumnHeader(COLUMNA_INMUEBLE, "Inmueble");
        tblTitulo.setColumnHeader(COLUMNA_ESTADO_TRAMITE, "Estado");
        tblTitulo.setColumnHeader(COLUMNA_FECHA_SEGUIMIENTO, "F. Seguimiento");
        tblTitulo.setColumnHeader(COLUMNA_NRO_TITULO, "Nro Titulo");
        tblTitulo.setColumnHeader(COLUMNA_FECHA_TITULO, "F. Titulo");
        tblTitulo.setColumnHeader(COLUMNA_SEDE, "Sede");
        tblTitulo.setColumnHeader(COLUMNA_FECHA_TERMINO, "F. Termino");
        tblTitulo.setColumnHeader(COLUMNA_OPCION_ELIMINAR, "");
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnGuardar)){
			TituloRegistral tituloRegistral=new TituloRegistral();
			tituloRegistral.setInforme(informe);
			tituloRegistral.setVehiculo((DetPerVehExp)cmbVehiculo.getValue());
			tituloRegistral.setInmueble((DetPerInmExp)cmbInmueble.getValue());
			tituloRegistral.setEstadoTramite(cmbEstado.getValor());
			tituloRegistral.setFechaSeguimiento((Date)dtFechaSeguimiento.getValue());
			tituloRegistral.setNroTitulo((String)txtNroTitulo.getValue());
			tituloRegistral.setFechaTitulo((Date)dtFechaTitulo.getValue());
			tituloRegistral.setSedeRegistral(cmbSede.getValor());
			tituloRegistral.setFechaTermino((Date)dtFechaTermino.getValue());
			tituloRegistralService.crear(tituloRegistral);
			limpiar();
			cargarDatos();
		}
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new VerticalLayout();
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(false);
		pnlPrincipal.setSpacing(true);
		
		// lytFormulario1
		lytFormulario1 = buildLytFormulario1();
		pnlPrincipal.addComponent(lytFormulario1);
		
		// lytFormulario2
		lytFormulario2 = buildLytFormulario2();
		pnlPrincipal.addComponent(lytFormulario2);
		
		// lytFormulario3
		lytFormulario3 = buildLytFormulario3();
		pnlPrincipal.addComponent(lytFormulario3);
		
		// lytFormulario4
		lytFormulario4 = buildLytFormulario4();
		pnlPrincipal.addComponent(lytFormulario4);
		
		// btnGuardar
		btnGuardar = new Button();
		btnGuardar.setCaption("Agregar");
		btnGuardar.setImmediate(true);
		btnGuardar.setWidth("-1px");
		btnGuardar.setHeight("-1px");
		pnlPrincipal.addComponent(btnGuardar);
		pnlPrincipal.setComponentAlignment(btnGuardar, new Alignment(20));
		
		// tblTitulo
		tblTitulo = new Table();
		tblTitulo.setImmediate(false);
		tblTitulo.setWidth("940px");
		tblTitulo.setHeight("200px");
		pnlPrincipal.addComponent(tblTitulo);
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private HorizontalLayout buildLytFormulario1() {
		// common part: create layout
		lytFormulario1 = new HorizontalLayout();
		lytFormulario1.setImmediate(false);
		lytFormulario1.setWidth("-1px");
		lytFormulario1.setHeight("-1px");
		lytFormulario1.setMargin(false);
		lytFormulario1.setSpacing(true);
		
		// lblVehiculo
		lblVehiculo = new Label();
		lblVehiculo.setImmediate(false);
		lblVehiculo.setWidth("160px");
		lblVehiculo.setHeight("-1px");
		lblVehiculo.setValue("Vehiculo");
		lytFormulario1.addComponent(lblVehiculo);
		
		// cmbVehiculo
		cmbVehiculo = new ComboBox();
		cmbVehiculo.setImmediate(false);
		cmbVehiculo.setWidth("150px");
		cmbVehiculo.setHeight("-1px");
		lytFormulario1.addComponent(cmbVehiculo);
		
		// lblInmueble
		lblInmueble = new Label();
		lblInmueble.setImmediate(false);
		lblInmueble.setWidth("160px");
		lblInmueble.setHeight("-1px");
		lblInmueble.setValue("Inmueble");
		lytFormulario1.addComponent(lblInmueble);
		
		// cmbInmueble
		cmbInmueble = new ComboBox();
		cmbInmueble.setImmediate(false);
		cmbInmueble.setWidth("150px");
		cmbInmueble.setHeight("-1px");
		lytFormulario1.addComponent(cmbInmueble);
		
		return lytFormulario1;
	}

	@AutoGenerated
	private HorizontalLayout buildLytFormulario2() {
		// common part: create layout
		lytFormulario2 = new HorizontalLayout();
		lytFormulario2.setImmediate(false);
		lytFormulario2.setWidth("-1px");
		lytFormulario2.setHeight("-1px");
		lytFormulario2.setMargin(false);
		lytFormulario2.setSpacing(true);
		
		// lblEstado
		lblEstado = new Label();
		lblEstado.setImmediate(false);
		lblEstado.setWidth("160px");
		lblEstado.setHeight("-1px");
		lblEstado.setValue("Estado Tramite Inscripcion");
		lytFormulario2.addComponent(lblEstado);
		
		// cmbEstado
		cmbEstado = new ComboBoxLOVS();
		cmbEstado.setImmediate(false);
		cmbEstado.setWidth("150px");
		cmbEstado.setHeight("-1px");
		lytFormulario2.addComponent(cmbEstado);
		
		// lblFechaSeguimiento
		lblFechaSeguimiento = new Label();
		lblFechaSeguimiento.setImmediate(false);
		lblFechaSeguimiento.setWidth("160px");
		lblFechaSeguimiento.setHeight("-1px");
		lblFechaSeguimiento.setValue("Fecha Seguimiento");
		lytFormulario2.addComponent(lblFechaSeguimiento);
		
		// dtFechaSeguimiento
		dtFechaSeguimiento = new PopupDateField();
		dtFechaSeguimiento.setImmediate(false);
		dtFechaSeguimiento.setWidth("150px");
		dtFechaSeguimiento.setHeight("-1px");
		dtFechaSeguimiento.setResolution(4);
		lytFormulario2.addComponent(dtFechaSeguimiento);
		
		return lytFormulario2;
	}

	@AutoGenerated
	private HorizontalLayout buildLytFormulario3() {
		// common part: create layout
		lytFormulario3 = new HorizontalLayout();
		lytFormulario3.setImmediate(false);
		lytFormulario3.setWidth("-1px");
		lytFormulario3.setHeight("-1px");
		lytFormulario3.setMargin(false);
		lytFormulario3.setSpacing(true);
		
		// lblNroTitulo
		lblNroTitulo = new Label();
		lblNroTitulo.setImmediate(false);
		lblNroTitulo.setWidth("160px");
		lblNroTitulo.setHeight("-1px");
		lblNroTitulo.setValue("N° Titulo Registral");
		lytFormulario3.addComponent(lblNroTitulo);
		
		// txtNroTitulo
		txtNroTitulo = new TextField();
		txtNroTitulo.setImmediate(false);
		txtNroTitulo.setWidth("150px");
		txtNroTitulo.setHeight("-1px");
		lytFormulario3.addComponent(txtNroTitulo);
		
		// lblFechaTitulo
		lblFechaTitulo = new Label();
		lblFechaTitulo.setImmediate(false);
		lblFechaTitulo.setWidth("160px");
		lblFechaTitulo.setHeight("-1px");
		lblFechaTitulo.setValue("Fecha Titulo Registral");
		lytFormulario3.addComponent(lblFechaTitulo);
		
		// dtFechaTitulo
		dtFechaTitulo = new PopupDateField();
		dtFechaTitulo.setImmediate(false);
		dtFechaTitulo.setWidth("150px");
		dtFechaTitulo.setHeight("-1px");
		dtFechaTitulo.setResolution(4);
		lytFormulario3.addComponent(dtFechaTitulo);
		
		return lytFormulario3;
	}

	@AutoGenerated
	private HorizontalLayout buildLytFormulario4() {
		// common part: create layout
		lytFormulario4 = new HorizontalLayout();
		lytFormulario4.setImmediate(false);
		lytFormulario4.setWidth("-1px");
		lytFormulario4.setHeight("-1px");
		lytFormulario4.setMargin(false);
		lytFormulario4.setSpacing(true);
		
		// lblSede
		lblSede = new Label();
		lblSede.setImmediate(false);
		lblSede.setWidth("160px");
		lblSede.setHeight("-1px");
		lblSede.setValue("Sede Registral");
		lytFormulario4.addComponent(lblSede);
		
		// cmbSede
		cmbSede = new ComboBoxLOVS();
		cmbSede.setImmediate(false);
		cmbSede.setWidth("150px");
		cmbSede.setHeight("-1px");
		lytFormulario4.addComponent(cmbSede);
		
		// lblFechaTermino
		lblFechaTermino = new Label();
		lblFechaTermino.setImmediate(false);
		lblFechaTermino.setWidth("160px");
		lblFechaTermino.setHeight("-1px");
		lblFechaTermino.setValue("Fecha Termino Subsanacion");
		lytFormulario4.addComponent(lblFechaTermino);
		
		// dtFechaTermino
		dtFechaTermino = new PopupDateField();
		dtFechaTermino.setImmediate(false);
		dtFechaTermino.setWidth("150px");
		dtFechaTermino.setHeight("-1px");
		dtFechaTermino.setResolution(4);
		lytFormulario4.addComponent(dtFechaTermino);
		
		return lytFormulario4;
	}

}
